package co.edu.usbcali.lidis.vista;

import java.awt.BorderLayout;
import java.awt.Image;
import java.awt.Toolkit;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

import org.apache.mahout.cf.taste.impl.model.jdbc.PostgreSQLJDBCDataModel;
import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
import org.apache.mahout.cf.taste.model.JDBCDataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;
import org.postgresql.ds.PGPoolingDataSource;

import co.edu.usbcali.lidis.dataaccess.daoFactory.FachadaBaseDeDatos;
import co.edu.usbcali.lidis.modelo.Proyecto;
import co.edu.usbcali.lidis.modelo.Usuario;

import javax.swing.GroupLayout.Alignment;
import javax.swing.GroupLayout;
import javax.swing.LayoutStyle.ComponentPlacement;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

@SuppressWarnings("serial")
public class PantallaPropuesta extends javax.swing.JFrame {

	private Usuario usuario;

	public PantallaPropuesta(int idUsuario, final Proyecto proyecto) {
		setUndecorated(true);
		usuario = new Usuario();
		usuario.setUsuId(idUsuario);
		initComponents();
		btnRecomendacion.setEnabled(false);
		if (idUsuario == 0) {
			txtTitulo.setText(proyecto.getProTitulo());
			txtPalClaves.setText(proyecto.getProPalclave());
			txtObjGeneral.setText(proyecto.getProObjGeneral());
			txtObjEspec.setText(proyecto.getProObjEspecificos());
			txtMarcoTeorico.setText(proyecto.getProContenido());
			btnGuardar.setVisible(false);
			btnRecomendacion.setVisible(false);
		}
		String path = System.getProperty("user.dir");
		Panel p = new Panel(path + "/imagenes/fondoPropuesta.png");
		getContentPane().add(p, BorderLayout.CENTER);
		this.pack();
		setSize(572, 699);
	}

	private void initComponents() {
		btnGuardar = new javax.swing.JButton();
		btnSalir = new javax.swing.JButton();
		btnSalir.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				PantallaInicio pantallaInicio=new PantallaInicio();
				pantallaInicio.setSize(510, 302);
				pantallaInicio.setVisible(true);
				pantallaInicio.setLocationRelativeTo(null);
				dispose();
				setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	
			}
		});
		txtTitulo = new javax.swing.JTextField();
		lblTitulo = new javax.swing.JLabel();
		lblPalClaves = new javax.swing.JLabel();
		txtPalClaves = new javax.swing.JTextField();
		btnRecomendacion = new javax.swing.JButton();
		lblObjGeneral = new javax.swing.JLabel();
		lblObjEspec = new javax.swing.JLabel();
		lblMarcoTeorico = new javax.swing.JLabel();
		jScrollPane1 = new javax.swing.JScrollPane();
		txtObjGeneral = new javax.swing.JTextArea();
		jScrollPane2 = new javax.swing.JScrollPane();
		txtObjEspec = new javax.swing.JTextArea();
		jScrollPane3 = new javax.swing.JScrollPane();
		txtMarcoTeorico = new javax.swing.JTextArea();

		setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
		setTitle("Formulario Proyecto de Investigación");
		setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
		setForeground(java.awt.Color.white);
		setIconImage(getIconImage());

		btnGuardar.setMnemonic('1');
		btnGuardar.setText("Guardar");

		btnGuardar.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				btnGuardarActionPerformed(evt);
			}
		});

		btnSalir.setMnemonic('s');
		btnSalir.setText("Salir");

		lblTitulo.setText("Título de Proyecto:");

		lblPalClaves.setText("Palabras Claves:");

		btnRecomendacion.setMnemonic('1');
		btnRecomendacion.setText("Ver Recomendación");
		
		btnRecomendacion.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				btnRecomendacionActionPerformed(evt);
			}
		});

		lblObjGeneral.setText("Objetivo General:");

		lblObjEspec.setText("Objetivos Específicos:");

		lblMarcoTeorico.setText("Marco Teórico:");

		txtObjGeneral.setColumns(20);
		txtObjGeneral.setRows(3);
		jScrollPane1.setViewportView(txtObjGeneral);

		txtObjEspec.setColumns(20);
		txtObjEspec.setRows(5);
		jScrollPane2.setViewportView(txtObjEspec);

		txtMarcoTeorico.setColumns(20);
		txtMarcoTeorico.setRows(5);
		jScrollPane3.setViewportView(txtMarcoTeorico);

		javax.swing.GroupLayout layout = new javax.swing.GroupLayout(
				getContentPane());
		layout.setHorizontalGroup(layout
				.createParallelGroup(Alignment.LEADING)
				.addGroup(
						layout.createSequentialGroup()
								.addGroup(
										layout.createParallelGroup(
												Alignment.LEADING)
												.addGroup(
														layout.createSequentialGroup()
																.addGap(28)
																.addGroup(
																		layout.createParallelGroup(
																				Alignment.LEADING,
																				false)
																				.addComponent(
																						lblPalClaves,
																						GroupLayout.DEFAULT_SIZE,
																						GroupLayout.DEFAULT_SIZE,
																						Short.MAX_VALUE)
																				.addComponent(
																						lblObjGeneral,
																						GroupLayout.DEFAULT_SIZE,
																						GroupLayout.DEFAULT_SIZE,
																						Short.MAX_VALUE)
																				.addComponent(
																						lblObjEspec,
																						GroupLayout.DEFAULT_SIZE,
																						GroupLayout.DEFAULT_SIZE,
																						Short.MAX_VALUE)
																				.addComponent(
																						lblMarcoTeorico,
																						GroupLayout.DEFAULT_SIZE,
																						GroupLayout.DEFAULT_SIZE,
																						Short.MAX_VALUE)
																				.addComponent(
																						lblTitulo,
																						GroupLayout.DEFAULT_SIZE,
																						GroupLayout.DEFAULT_SIZE,
																						Short.MAX_VALUE))
																.addGap(18)
																.addGroup(
																		layout.createParallelGroup(
																				Alignment.LEADING,
																				false)
																				.addComponent(
																						jScrollPane1,
																						339,
																						GroupLayout.DEFAULT_SIZE,
																						GroupLayout.PREFERRED_SIZE)
																				.addComponent(
																						jScrollPane2,
																						339,
																						GroupLayout.DEFAULT_SIZE,
																						GroupLayout.PREFERRED_SIZE)
																				.addComponent(
																						jScrollPane3,
																						339,
																						GroupLayout.DEFAULT_SIZE,
																						GroupLayout.PREFERRED_SIZE)
																				.addComponent(
																						txtTitulo,
																						GroupLayout.PREFERRED_SIZE,
																						339,
																						GroupLayout.PREFERRED_SIZE)
																				.addComponent(
																						txtPalClaves,
																						GroupLayout.PREFERRED_SIZE,
																						339,
																						GroupLayout.PREFERRED_SIZE)))
												.addGroup(
														layout.createSequentialGroup()
																.addGap(91)
																.addComponent(
																		btnGuardar)
																.addGap(46)
																.addComponent(
																		btnRecomendacion)
																.addGap(37)
																.addComponent(
																		btnSalir)))
								.addContainerGap(30, Short.MAX_VALUE)));
		layout.setVerticalGroup(layout
				.createParallelGroup(Alignment.LEADING)
				.addGroup(
						layout.createSequentialGroup()
								.addGap(136)
								.addGroup(
										layout.createParallelGroup(
												Alignment.BASELINE)
												.addComponent(lblTitulo)
												.addComponent(
														txtTitulo,
														GroupLayout.PREFERRED_SIZE,
														GroupLayout.DEFAULT_SIZE,
														50))
								.addPreferredGap(ComponentPlacement.UNRELATED)
								.addGroup(
										layout.createParallelGroup(
												Alignment.BASELINE)
												.addComponent(lblPalClaves)
												.addComponent(
														txtPalClaves,
														GroupLayout.PREFERRED_SIZE,
														GroupLayout.DEFAULT_SIZE,
														GroupLayout.PREFERRED_SIZE))
								.addGap(18)
								.addGroup(
										layout.createParallelGroup(
												Alignment.LEADING)
												.addComponent(
														jScrollPane1,
														GroupLayout.PREFERRED_SIZE,
														69,
														GroupLayout.PREFERRED_SIZE)
												.addComponent(lblObjGeneral))
								.addGap(21)
								.addGroup(
										layout.createParallelGroup(
												Alignment.LEADING)
												.addComponent(lblObjEspec)
												.addComponent(
														jScrollPane2,
														GroupLayout.PREFERRED_SIZE,
														GroupLayout.DEFAULT_SIZE,
														GroupLayout.PREFERRED_SIZE))
								.addGap(23)
								.addGroup(
										layout.createParallelGroup(
												Alignment.LEADING)
												.addComponent(lblMarcoTeorico)
												.addComponent(
														jScrollPane3,
														GroupLayout.PREFERRED_SIZE,
														156,
														GroupLayout.PREFERRED_SIZE))
								.addPreferredGap(ComponentPlacement.RELATED,
										36, Short.MAX_VALUE)
								.addGroup(
										layout.createParallelGroup(
												Alignment.BASELINE)
												.addComponent(btnGuardar)
												.addComponent(btnSalir)
												.addComponent(btnRecomendacion))
								.addGap(30)));
		getContentPane().setLayout(layout);

		setSize(new java.awt.Dimension(548, 698));
		setLocationRelativeTo(null);
	}

	private void btnGuardarActionPerformed(java.awt.event.ActionEvent evt) {

		Proyecto proyecto = new Proyecto();
		proyecto.setProTitulo(txtTitulo.getText());
		proyecto.setProPalclave(txtPalClaves.getText());
		proyecto.setProObjGeneral(txtObjGeneral.getText());
		proyecto.setProObjEspecificos(txtObjEspec.getText());
		proyecto.setProContenido(txtMarcoTeorico.getText());
		proyecto.setUsuario(usuario);
		try {
			if (txtTitulo.getText().trim().equals("") == true) {
				throw new Exception("Por favor ingrese un título.");
			}
			if (txtPalClaves.getText().trim().equals("") == true) {
				throw new Exception("Por favor ingrese las palabras claves.");
			}

			if (txtObjGeneral.getText().trim().equals("") == true) {
				throw new Exception("Por favor ingrese el objetivo general.");
			}

			if (txtObjEspec.getText().trim().equals("") == true) {
				throw new Exception(
						"Por favor ingrese los objetivos específicos.");
			}

			if (txtMarcoTeorico.getText().trim().equals("") == true) {
				throw new Exception("Por favor ingrese el marco teórico.");
			}

			boolean guardarProyecto = FachadaBaseDeDatos.getInstance()
					.guadarProyecto(proyecto);
			if (guardarProyecto) {
				JOptionPane.showMessageDialog(null,
						"El proyecto se guardó exitosamente.", "OK",
						JOptionPane.INFORMATION_MESSAGE);
				btnRecomendacion.setEnabled(true);
				btnGuardar.setEnabled(false);
			} else {
				throw new Exception("El proyecto no se guardó.");
			}
		} catch (Exception e) {
			JOptionPane.showMessageDialog(null, e.getMessage(), "Error",
					JOptionPane.ERROR_MESSAGE);
		}

	}

	private void btnRecomendacionActionPerformed(java.awt.event.ActionEvent evt) {
		Long codProyectoRecom = 0L;
		List<Long> idProyectos = new ArrayList<Long>();
		List<Proyecto> proyectosRecomendados = new ArrayList<Proyecto>();

		try {
			String palabraClave = txtPalClaves.getText().toUpperCase();
			int retornoFuncion = FachadaBaseDeDatos.getInstance()
					.ejecutarModelo(palabraClave);

			if (retornoFuncion == 0) {
				PGPoolingDataSource dataSource = new PGPoolingDataSource();
				dataSource.setServerName("localhost");
				dataSource.setDatabaseName("tesis");
				dataSource.setUser("postgres");
				dataSource.setPassword("P0stgressql");
				dataSource.setMaxConnections(10);

				JDBCDataModel dataModel = new PostgreSQLJDBCDataModel(
						dataSource, "RECOMENDACION", "USU_ID", "PRO_ID",
						"PUN_VALOR", null);

				UserSimilarity similarity = new PearsonCorrelationSimilarity(
						dataModel);
				UserNeighborhood neighborhood = new NearestNUserNeighborhood(2,
						similarity, dataModel);

				Recommender recommender = new GenericUserBasedRecommender(
						dataModel, neighborhood, similarity);

				List<RecommendedItem> recommendations = recommender.recommend(
						usuario.getUsuId(), 5);

				if (recommendations.size() > 0) {

					for (RecommendedItem recommendation : recommendations) {
						codProyectoRecom = recommendation.getItemID();
						idProyectos.add(codProyectoRecom);
						System.out.println(codProyectoRecom);
					}

					for (int i = 0; i < idProyectos.size(); i++) {
						Proyecto proyecto = FachadaBaseDeDatos.getInstance()
								.consultarProyectoPorId(idProyectos.get(i));
						proyectosRecomendados.add(proyecto);
					}

					PantallaRecomendacion pantallaPropuesta = new PantallaRecomendacion(
							proyectosRecomendados, palabraClave);
					pantallaPropuesta.setSize(440, 344);
					pantallaPropuesta.setVisible(true);
					pantallaPropuesta.setLocationRelativeTo(null);
					dispose();
					setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				} else {
					throw new Exception(
							"No se ha generado una recomnedación para el perfil de este usuario.");
				}
			}
		} catch (Exception e) {
			JOptionPane.showMessageDialog(null, e.getMessage(), "Error",
					JOptionPane.ERROR_MESSAGE);
		}
		btnRecomendacion.setEnabled(false);
	}

	@Override
	public Image getIconImage() {
		String path = System.getProperty("user.dir");
		System.out.println(path);
		Toolkit toolkit = Toolkit.getDefaultToolkit();
		Image retValue = toolkit.getImage(path + "/imagenes/icono.png");
		return retValue;
	}

	// Variables declaration - do not modify
	private javax.swing.JButton btnGuardar;
	private javax.swing.JButton btnRecomendacion;
	private javax.swing.JButton btnSalir;
	private javax.swing.JScrollPane jScrollPane1;
	private javax.swing.JScrollPane jScrollPane2;
	private javax.swing.JScrollPane jScrollPane3;
	private javax.swing.JLabel lblMarcoTeorico;
	private javax.swing.JLabel lblObjEspec;
	private javax.swing.JLabel lblObjGeneral;
	private javax.swing.JLabel lblPalClaves;
	private javax.swing.JLabel lblTitulo;
	private javax.swing.JTextArea txtMarcoTeorico;
	private javax.swing.JTextArea txtObjEspec;
	private javax.swing.JTextArea txtObjGeneral;
	private javax.swing.JTextField txtPalClaves;
	private javax.swing.JTextField txtTitulo;
	// End of variables declaration
}
